package com.tianfei.crowd.service.impl;

import com.tianfei.crowd.entity.po.MemberConfirmInfoPO;
import com.tianfei.crowd.entity.po.MemberLaunchInfoPO;
import com.tianfei.crowd.entity.po.ProjectPO;
import com.tianfei.crowd.entity.po.ReturnPO;
import com.tianfei.crowd.entity.vo.*;
import com.tianfei.crowd.mapper.*;
import com.tianfei.crowd.service.api.ProjectService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * MySql 端本地的Service
 *
 * @author: Herz
 * @date: 2021/8/3 19:39
 */
@Transactional(readOnly = true)
@Service
public class ProjectServiceImpl implements ProjectService {

    @Autowired
    private ProjectPOMapper projectPOMapper;

    @Autowired
    private TypePOMapper typePOMapper;

    @Autowired
    private TagPOMapper tagPOMapper;

    @Autowired
    private ProjectItemPicPOMapper projectItemPicPOMapper;

    @Autowired
    private ReturnPOMapper returnPOMapper;

    @Autowired
    private MemberLaunchInfoPOMapper memberLaunchInfoPOMapper;

    @Autowired
    private MemberConfirmInfoPOMapper memberConfirmInfoPOMapper;


    /**
     * 将 session 中临时存储的 ProjectVO 的各个属性存入数据库
     *
     * @param projectVO
     * @param memberId
     */
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    @Override
    public void saveProject(ProjectVO projectVO, Integer memberId) {

        // 一、保存 ProjectPO
        // 1、创建一个空的 ProjectPO 对象
        ProjectPO projectPO = new ProjectPO();

        // 2、把 projectVO 的部分属性复制到 projectPO 里面
        BeanUtils.copyProperties(projectVO, projectPO);

        // 3、保存projectPO
        // 为了能够获取到 projectPO 保存后自增的主键，需要在 mapper 里做相关设置
        //  <insert id="insertSelective" useGeneratedKeys="true" keyProperty="id" ....
        projectPO.setMemberid(memberId);

        // 修复bug：设置创建时间
        String createdate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        projectPO.setCreatedate(createdate);

        // 修复bug：设置status
        projectPO.setStatus(0);

        // 执行保存
        projectPOMapper.insertSelective(projectPO);

        // 4、从 projectPO 对象这里获取主键
        Integer projectId = projectPO.getId();


        // 二、保存 项目、分类的关联信息
        // 1、从 ProjectVO 中获取 分类id 集合
        List<Integer> typeIdList = projectVO.getTypeIdList();

        // 2、执行保存
        typePOMapper.insertRelationship(projectId, typeIdList);


        // 三、保存 项目、标签的关联信息
        // 1、从 ProjectVO 中 获取 标签id 集合
        List<Integer> tagIdList = projectVO.getTagIdList();

        // 2、执行保存
        tagPOMapper.insertRelationship(projectId, tagIdList);


        // 四、保存 项目详情图片信息
        // 1、从 ProjectVO 中获取 项目详情图片地址集合
        List<String> picturePathList = projectVO.getDetailPicturePathList();

        // 2、执行保存
        projectItemPicPOMapper.insertWithPicPathList(projectId, picturePathList);


        // 五、保存 项目 回报信息
        // 1、从 ProjectVO 中获取 回报信息集合
        List<ReturnVO> returnVOList = projectVO.getReturnVOList();

        // 2、创建一个空的 returnPO 对象
        ReturnPO returnPO = new ReturnPO();

        // 3、遍历 returnVOList 集合 将 returnVO 的属性复制到 returnPO 中并且 设置 projectId
        for (ReturnVO returnVO : returnVOList) {
            BeanUtils.copyProperties(returnVO, returnPO);

            returnPO.setProjectid(projectId);

            // 4、执行保存
            returnPOMapper.insert(returnPO);
        }


        // 六、保存 项目 发起人信息
        // 1、从 ProjectVO 中获取 发起人信息
        MemberLauchInfoVO memberLauchInfoVO = projectVO.getMemberLauchInfoVO();

        // 2、创建一个空的 MemberLaunchInfoPO 对象
        MemberLaunchInfoPO memberLaunchInfoPO = new MemberLaunchInfoPO();

        // 3、将 memberLauchInfoVO 的属性复制到 memberLaunchInfoPO 中，并在 memberLaunchInfoPO 中设置 memberId
        BeanUtils.copyProperties(memberLauchInfoVO, memberLaunchInfoPO);

        memberLaunchInfoPO.setMemberid(memberId);

        // 4、执行保存
        memberLaunchInfoPOMapper.insert(memberLaunchInfoPO);


        // 七、保存 项目 确认信息
        // 1、从 ProjectVO 中获取 确认信息
        MemberConfirmInfoVO memberConfirmInfoVO = projectVO.getMemberConfirmInfoVO();

        // 2、创建一个空的 MemberConfirmInfoPO 对象
        MemberConfirmInfoPO memberConfirmInfoPO = new MemberConfirmInfoPO();

        // 3、将 memberConfirmInfoVO 的属性值复制到 memberConfirmInfoPO 中，并且在 memberConfirmInfoPO 中设置 memberId
        BeanUtils.copyProperties(memberConfirmInfoVO, memberConfirmInfoPO);

        memberConfirmInfoPO.setMemberid(memberId);

        // 4、执行保存
        memberConfirmInfoPOMapper.insert(memberConfirmInfoPO);

    }

    /**
     * 获取 首页页面展示的 项目分类以及该分类下的部分项目
     *
     * @return
     */
    @Override
    public List<PortalTypeVO> getPortalTypeVOList() {

        List<PortalTypeVO> portalTypeVOList = projectPOMapper.selectPortalTypeVOList();

        return portalTypeVOList;
    }

    /**
     * 获取 首页跳转 项目详情页面
     *
     * @param projectId
     * @return
     */
    @Override
    public DetailProjectVO getDetailProjectVO(Integer projectId) {

        // 1、调用mapper执行查询
        DetailProjectVO detailProjectVO = projectPOMapper.selectDetailProjectVO(projectId);

        // 2、获取 detailProjectVO 的 status
        Integer status = detailProjectVO.getStatus();

        // 3、根据 status 设置 statusText
        switch (status) {

            case 0:
                detailProjectVO.setStatusText("审核中");
                break;
            case 1:
                detailProjectVO.setStatusText("众筹中");
                break;
            case 2:
                detailProjectVO.setStatusText("众筹成功");
                break;
            case 3:
                detailProjectVO.setStatusText("众筹失败");
            default:
                break;
        }

        // 4、获取 根据 deployDate 和 day 计算 lastDay
        // 2021-08-07
        String deployDate = detailProjectVO.getDeployDate();

        // 30
        Integer totalDays = detailProjectVO.getDay();

        // 获取当前时间
        // Sat Aug 07 20:52:40 GMT+08:00 2021
        Date currentDate = new Date();

        // 将 deployDate 转换为 Date 类型
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date deployDay = format.parse(deployDate);

            // 获取当前时间的时间戳
            long currentDateTime = currentDate.getTime();

            // 获取 deployDay 的时间戳
            long deployDayTime = deployDay.getTime();

            // 计算当前时间离 项目发布日期经过了多少天
            long pastDay = (currentDateTime - deployDayTime)/1000/3600/24;

            // 计算项目众筹的剩余时间
            Integer lastDay = (int)(totalDays - pastDay);

            detailProjectVO.setLastDay(lastDay);

        } catch (ParseException e) {
            e.printStackTrace();
        }

        // 返回 detailProjectVO 对象
        return detailProjectVO;
    }
}
